package scan

import (
	"crypto/md5"
	"encoding/json"
	"fmt"
	"log"
	"os"
	"regexp"

	"github.com/PuerkitoBio/goquery"
	"github.com/garyburd/redigo/redis"
)

const (
	text      = 0
	image     = 1
	PATH_ROOT = "/home/acfun/goprojects/src/sora/dataDst/"
)

type Div struct {
	Id int
	T  int    "type"
	C  string "content"
}

// 对Store的并发调用
func GetContent() {
	conn, err := redis.Dial("tcp", ":6379")
	if err != nil {
		log.Fatal(err)
	}
	// 从qvset(需要对内容更新的v的set) pop出数据
	for {
		if vroute, _ := redis.String(conn.Do("SPOP", "sora:qvset")); vroute != "" {
			StoreVolume(vroute)
		} else { // 取完了
			break
		}
	}
}
func StoreVolume(vroute string) {
	conn, err := redis.Dial("tcp", ":6379")
	if err != nil {
		log.Fatal(err)
		return
	}
	vid := regexp.MustCompile("\\w+\\:\\d+\\:(\\d+)").FindStringSubmatch(vroute)[1]
	cids, _ := redis.Strings(conn.Do("SMEMBERS", vroute+":cset"))

	vdir := PATH_ROOT + vid + "/"
	if !exist(vdir) { // 如果不存在则新建文件夹（递归建立）
		os.MkdirAll(vdir+"img/", 0755)
		os.MkdirAll(vdir+"content/", 0755)
		fmt.Println("建立DAZE")
	} else { // ！！务必删掉！！！
		//fmt.Println("pass:", vdir)
		return
	}
	for _, cid := range cids {
		if err := Store(vid, cid); err != nil {
			fmt.Println(err)
		}
	}
}

func TransContent(vid, cid string) ([]byte, error) {
	conn, err := redis.Dial("tcp", ":6379")
	if err != nil {
		log.Fatal(err)
	}
	doc, err := goquery.NewDocument(GetContentByChapterID + cid)
	if err != nil {
		//log.Fatal(err)
		return nil, err
	}
	dlist := make([]Div, 0)
	doc.Find(".ui-line").Each(func(i int, s *goquery.Selection) {
		// 判断此段落是否为图片
		addr, isImage := s.Find("img").Attr("data-original")
		d := &Div{}
		d.Id = i + 1
		if isImage {
			// 翻译&存储路径
			ourl := "http://lknovel.lightnovel.cn" + addr
			conn.Do("ZADD", "sora:qimg", vid, ourl)
			conn.Do("INCR", "sora:qimg:count")
			h := md5.New()
			h.Write([]byte(ourl))
			md_five := fmt.Sprintf("%x", h.Sum(nil))
			d.T = image
			d.C = "/" + vid + "/img/" + md_five + ".jpg" // 相对路径
		} else {
			d.T = text
			d.C = s.Text()
		}
		dlist = append(dlist, *d)
	})
	j, err := json.Marshal(dlist)
	if err != nil {
		return nil, err
	}
	return j, nil
}

// 根据id信息爬下并保存数据
// 在这里存下章节信息（为下载之用）
func Store(vid, cid string) error {
	vdir := PATH_ROOT + vid + "/"
	if !exist(vdir + "content/" + cid + ".json") {
		file, err := os.OpenFile(vdir+"content/"+cid+".json", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) // read only
		defer file.Close()
		if err != nil {
			log.Fatal(err)
			return err
		}
		js, err := TransContent(vid, cid)
		if err != nil {
			log.Fatal(err)
			return err
		}
		// 写文件
		if _, err := file.Write(js); err != nil {
			log.Fatal(err)
			return err
		}
		fmt.Println(vid + ":" + cid + "saved")
	}
	return nil
}
func exist(filename string) bool {
	_, err := os.Stat(filename)
	return err == nil || os.IsExist(err)
}
